package com.sc.nft.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sc.nft.entity.ActivityCoupons;
import com.sc.nft.entity.UserCoupons;
import com.sc.nft.entity.UserInfo;
import com.sc.nft.entity.dto.ActivityCouponsProductDTO;
import com.sc.nft.entity.dto.UseUserCouponsDTO;
import com.sc.nft.entity.dto.UserCouponsDTO;
import com.sc.nft.entity.vo.ActivityCouponsProductVO;
import com.sc.nft.entity.vo.UseCouponsCommand;
import com.sc.nft.entity.vo.UserCouponsProductVO;
import com.sc.nft.enums.UserCouponsStatusEnum;

import java.math.BigDecimal;
import java.util.List;

/**
 * 用户优惠券服务接口
 *
 * @author liGen
 * @version 1.0
 * @date 2023/12/5 4:34 下午
 */
public interface UserCouponsService {

    /**
     * 领取优惠券
     *
     * @param activityCoupons 优惠券活动
     * @param userInfo        用户
     * @return
     */
    UserCoupons receive(ActivityCoupons activityCoupons, UserInfo userInfo);

    /**
     * 获取用户该优惠券活动下的有效优惠券
     *
     * @param userId
     * @param couponsId
     * @return
     */
    List<UserCoupons> getValidUserCoupons(Long userId, Long couponsId);

    /**
     * 获取用户优惠券
     *
     * @param userId
     * @return
     */
    List<UserCouponsDTO> getUserCoupons(Long userId, UserCouponsStatusEnum userCouponsStatusEnum);

    /**
     * 获取用户可用优惠券
     *
     * @param userId            用户ID
     * @param activityProductId 活动商品ID
     * @param activityProductId 活动商品ID
     * @return
     */
    List<UserCouponsDTO> getUserCanCoupons(Long userId, Long activityProductId, BigDecimal orderPrice);

    /**
     * 修改优惠券状态 只有未使用状态可修改
     *
     * @param id
     * @param userCouponsStatusEnum
     */
    void updateStatus(Long id, UserCouponsStatusEnum userCouponsStatusEnum);

    /**
     * 获取用户优惠券
     *
     * @param id
     * @return
     */
    UserCoupons getById(Long id);

    /**
     * 获取订单下使用的优惠券
     *
     * @param orderId
     * @return
     */
    UserCoupons getByOrderId(Long orderId);

    /**
     * 使用用户优惠券
     *
     * @param userCouponsId
     * @param cmd
     * @param userId
     * @return
     */
    UseUserCouponsDTO useUserCoupons(Long userCouponsId, UseCouponsCommand cmd, Long userId);

    /**
     * 优惠券能否使用校验
     *
     * @param userCoupons
     * @param userId
     * @param money
     * @param activityProductId
     * @return
     */
    UseUserCouponsDTO checkUse(UserCoupons userCoupons, Long userId, BigDecimal money, Long activityProductId);

    /**
     * 获取用户优惠券下的可用商品
     *
     * @param userCouponsProductVO
     * @return
     */
    Page<ActivityCouponsProductDTO> getActivityCouponsProductDTOPage(UserCouponsProductVO userCouponsProductVO);
}
